#!/usr/bin/env bash


# INFO------------------------------------------------------------------


#    GNU GENERAL PUBLIC LICENSE
#
#    Distro Down - Baixe e grave ISO's facilmente.
#    Copyright (C) 2018  <Guilherme Machado>
#    Free Software Foundation, Inc.
#
#-----------------------------------------------------------------------
#
#    This program is free software: you can redistribute 
#    it and/or modify it under the terms of the GNU General 
#    Public License as published by the Free Software Foundation, 
#    either version 3 of the License, or (at your option) any later
#    version.
#
#    This program is distributed in the hope that it will be useful, 
#    but WITHOUT ANY WARRANTY; without even the implied warranty of 
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#    See the GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see 
#    <http://www.gnu.org/licenses/>.
#
#
#    Nome: distrodown
#    Autor: Guilherme Felix Machado
#    Contato: < machadofguilherme@gmail.com >
#    Desenvolvido em: 27 de Março de 2018
#    Versão: 1.6.2-Dev
#
#    Descrição: Distro Down é uma aplicação destinada a tornar mais fá-
#    cil o download e gravação de sua ISO favorita. Não precisa mais ir 
#    em site oficial, basta apenas acessar o programa pelo seu shell e 
#    efetuar o download enquanto trabalha ou estuda.


# VARIÁVEIS-------------------------------------------------------------

#----------------------------- principais ------------------------------
pasta="/home/$USER/"
fonte_local="libs/"
endereco_sync="https://notabug.org/colorado/distrodown.git"
aviso=$(echo -e "
\t${verde}${negrito} O Download da ISO foi concluído com sucesso.${fecha_cor}")
#-----------------------------------------------------------------------

#-------------------------------- chaves -------------------------------
sin="0" # Desligado
#-----------------------------------------------------------------------

#--------------------------------- cores -------------------------------
vermelho=$'\E[31m'
verde=$'\E[32m'
fecha_cor=$'\E[m'
negrito=$(tput bold)
#-----------------------------------------------------------------------

#-------------------------------- url's --------------------------------
# As URLs aqui contidas são endereços oficiais dos repositórios de cada
# um dos projetos aqui disponíveis. O conteúdo é exatamente o mesmo, sem
# nenhuma modificação em seus dados. Os endereços foram encurtados com 
# serviço para melhor leitura de código. Se ainda assim houver dúvidas,
# verifique a hash do arquivo baixado e compare. 
#
#
#=====================================================================
# Espelhos:
#=====================================================================
#
#
#   http://mirror.clarkson.edu/
#   https://mirrors.edge.kernel.org/
#
#

arch_linux="http://bit.ly/2KwXPU5" 
debian_os="http://bit.ly/2IEJKP8" 
fedora_core="http://bit.ly/2MAxUbb" 
l_mint="http://bit.ly/2NctqsH" 
centos_os="http://bit.ly/2tQ2tSB" 
opensuse_leap="http://bit.ly/2Kp5LHP" 
opensuse_roll="http://bit.ly/2lK2HHp" 
slackware="http://bit.ly/2NbWi49" 
ubuntults="http://bit.ly/2tSyE3U" 
ubuntuserverlts="http://bit.ly/2MBv0TT" 
gentoo="http://bit.ly/2KgrCQR" 
stage3="https://bit.ly/2tiPrwD" 
trisquel="http://bit.ly/2trucJe" 
deepin="http://bit.ly/2lIYUtN" 
manjaro_rato="http://bit.ly/2KpBNDh" 
manjaro_plasma="http://bit.ly/2KxBaXK" 
manjaro_pe="http://bit.ly/2KkZnkO" 
elementary="http://bit.ly/2thynrB"
puppy="http://bit.ly/2K0s6uK" 
solus="http://bit.ly/2ywa1Q3"
artixlinux="http://bit.ly/2KmszYE" 
sabayon_mate="http://bit.ly/2KwIwux" 
parrot_sec="http://bit.ly/2KmGlub"
#-----------------------------------------------------------------------

#--------------------------------- names -------------------------------
arch="archlinux-2018.07.01-x86_64.iso"
artix="artix-lxqt-20180108-x86_64.iso"
debian="debian-9.4.0-amd64-netinst.iso"
fedora="Fedora-Workstation-Live-x86_64-28-1.1.iso"
mint="linuxmint-19-cinnamon-64bit.iso"
centos="CentOS-7-x86_64-Minimal-1804.iso"
suseleap="openSUSE-Leap-15.0-DVD-x86_64-Current.iso"
suseroll="openSUSE-Tumbleweed-DVD-x86_64-Current.iso"
slack="slackware64-14.2-install-dvd.iso"
buntu="ubuntu-18.04-desktop-amd64.iso"
buntuserver="ubuntu-18.04-live-server-amd64.iso"
gen="install-amd64-minimal-20180415T214502Z.iso"
stage="stage3-amd64-20180614T214502Z.tar.xz"
trisquellibre="trisquel_8.0_amd64.iso"
deepinch="deepin-15.6-amd64.iso"
manjaxfce="manjaro-xfce-17.1.10-stable-x86_64.iso"
manjakde="manjaro-kde-17.1.10-stable-x86_64.iso"
manjagnome="manjaro-gnome-17.1.10-stable-x86_64.iso"
eos="elementaryos-0.4.1-stable.20180214.iso"
chibi_puppy="xenialpup64-7.5-uefi.iso"
sol="Solus-3-Budgie.iso"
sabamate="Sabayon_Linux_18.04_amd64_MATE.iso"
pa_security="Parrot-security-4.1_amd64.iso"
#-----------------------------------------------------------------------


# BIBLIOTECAS ----------------------------------------------------------

# Teste para habilitar libs.
if [ -d "/usr/lib/distrodown" ]; then
	sin=1 && fonte_local="/usr/lib/distrodown/"
fi

source "$fonte_local"write-arch.sh
source "$fonte_local"write-artix.sh
source "$fonte_local"write-debian.sh
source "$fonte_local"write-fedora.sh
source "$fonte_local"write-mint.sh
source "$fonte_local"write-centos.sh
source "$fonte_local"write-suseleap.sh
source "$fonte_local"write-suseroll.sh
source "$fonte_local"write-slackware.sh
source "$fonte_local"write-ubuntu.sh
source "$fonte_local"write-ubuntuserver.sh
source "$fonte_local"write-gentoo.sh
source "$fonte_local"write-trisquel.sh
source "$fonte_local"write-deepin.sh
source "$fonte_local"write-manjaroxfce.sh
source "$fonte_local"write-manjarokde.sh
source "$fonte_local"write-manjarognome.sh
source "$fonte_local"write-elementary.sh
source "$fonte_local"write-puppy.sh
source "$fonte_local"write-solus.sh
source "$fonte_local"write-parrot.sh
source "$fonte_local"write-sabayon.sh
#-----------------------------------------------------------------------


# FUNÇÕES --------------------------------------------------------------


ajuda () {
   cat << EOF
 
 Menu de ajuda para a utilização do Distro Down.


    	MODO DE USO:

 		       distrodown <operation> [options]
                  Ex1: distrodown archlinux
                  Ex2: distrodown -i

	OPÇÕES:


	-h     --help                 Exibe o menu de ajuda.
	-i     --info                 Sistemas suportados.
	-v     --version              Exibe a versão do aplicativo.
	-w     --write                Permite escrita em dispositivo USB.
        -s     --sync                 Sincroniza as bibliotecas com o repositório.

EOF
}

loop () {

    typeset t
    t="0"
    while sleep 0.4; do
        git clone "$endereco_sync" /tmp/ >/dev/null 2>&1
        # Teste de transferência de dados.
        if [ -d "/usr/lib/distrodown/" ]; then
            cp /tmp/distrodown-dev/distrodown /usr/bin/
            cp -R /tmp/distrodown-dev/libs/* /usr/lib/distrodown/
        else    
            cp /tmp/distrodown-dev/distrodown $PWD
            cp -R /tmp/distrodown-dev/libs/* $PWD/libs/
        fi
        rm -rf /tmp/distrodown-dev/
        echo -ne "\r${vermelho}[${fecha_cor} \E[34;1m${t}% ${vermelho}]${fecha_cor}"
        ((t++))
        [ "$t" -eq 101 ] && break
    done

}

sobre () {

		echo "

            Copyright (C) 2018  <Guilherme Machado>
            Versão 1.6.2-Dev
            Free Software Foundation, Inc.

            This program is distributed in the hope that it 
            will be useful, but WITHOUT ANY WARRANTY; without even 
            the implied warranty of MERCHANTABILITY or FITNESS FOR 
            A PARTICULAR PURPOSE. See the GNU General Public License
            for more details.

            "  
		exit 0 
} 

axel_progresso () {
  axel -a -n 5 "$1" -o "$pasta/$2"
}

ctrl_c () {
	echo -e "
	${vermelho}${negrito} Encerrando programa...${fecha_cor}\n"
	exit 0
}

mensagem () {
  echo -e "\n${vermelho}${negrito} Digite uma opção válida. Execute 'distrodown --info' 
    ou 'distrodown --help' para mais informações.${fecha_cor}\n"
}
#-----------------------------------------------------------------------


# BLOCO DE TESTES-------------------------------------------------------

# Teste se dependências estão instaladas no sistema.
if [ ! $(type -P sudo)       ] >/dev/null 2>&1; then
	echo "Para execução, instale o pacote 'sudo'."
	exit 1
fi

if [ ! $(type -P git)        ] >/dev/null 2>&1; then
	echo "Para execução, instale o pacote 'git'."
	exit 1
fi

if [ ! $(type -P mkfs)       ] >/dev/null 2>&1; then
	echo "Para execução, instale o pacote 'dosfstools'."
	exit 1
fi

if [ ! $(type -P gvfs-mount) ] >/dev/null 2>&1; then
	echo "Para execução, instale o pacote 'gvfs'."
	exit 1
fi

if [ ! $(type -P axel) ] >/dev/null 2>&1; then
	echo "Para execução, instale o pacote 'axel'."
	exit 1
fi

# Teste para imprimir o menu de ajuda ao executar.
[ "$1" = "" ] || [ "$1" =  "-h" ] || \
[ "$1" = "--help" ] && ajuda 

# Teste de compatibilidade com o usuário.
[ "$(id -u)" = "0" ] && pasta="/"
#-----------------------------------------------------------------------


# PROGRAMA -------------------------------------------------------------

# Teclas chave de encerramento.
trap ctrl_c INT

case $1 in

# Chama o menu '--info'.
   -i|--info)  
       echo -e "

	             Sistemas atualmente suportados.


        > archlinux                [ Arch Linux ]
        > artixlinux               [ Artix Linux ]
        > debian                   [ Debian Netinst 9.4 ]
        > fedora                   [ Fedora Workstation 28 ]
        > mint                     [ Linux Mint 19 Tara ]
        > centos                   [ CentOS 7 - Minimal ISO ]
        > opensuse-leap            [ openSUSE Leap 15.0 - DVD ISO ] 
        > opensuse-roll            [ openSUSE Tumbleweed - DVD ISO ] 
        > slackware                [ Slackware Linux 14.2 - DVD ISO ] 
        > ubuntu                   [ Ubuntu 18.04 LTS ]
        > ubuntuserver             [ Ubuntu Server 18.04 LTS ]
        > gentoo                   [ Gentoo Linux ]
        > trisquel                 [ Trisquel GNU/Linux 8.0 LTS Flidas ]
        > deepin                   [ Deepin Linux 15.6 ]
        > manjaro-xfce             [ Manjaro XFCE Edition (17.1.10) ]
        > manjaro-plasma              [ Manjaro KDE Edition (17.1.10) ]
        > manjaro-gnome            [ Manjaro GNOME Edition (17.1.10) ]
        > elementary               [ elementary OS 0.4.1 Loki ]
        > puppy                    [ Puppy Linux Xenialpup 7.5 CE ]
        > solus                    [ Solus ] 
        > parrot-security          [ Parrot GNU/Linux Security ]
        > sabayon-mate             [ Sabayon Mate edition ] \n" 
        exit 0 
    ;;

# Exibe a versão e o desenvolvedor do aplicativo.
   -v|--version) 
      sobre
    ;;

# Os blocos seguintes realizam o download das ISO's.
   archlinux) # Arch Linux
      echo
      # A distro é baixada via axel.
      if axel_progresso $arch_linux $arch; then
         sleep 2 ; echo -e "$aviso
         " ; exit 0 
      else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi        
    ;;
    
    artixlinux) # Artix Linux
      echo
      # A distro é baixada via axel.
      if axel_progresso $artixlinux $artix; then
         sleep 2 ; echo -e "$aviso
         " ; exit 0 
      else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi        
    ;;

    debian) # Debian
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $debian_os $debian; then
	     sleep 2 ; echo -e "$aviso
	     " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi        
    ;;

    fedora) # Fedora
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $fedora_core $fedora; then
	     sleep 2 ; echo -e "$aviso
	     " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi        
    ;;

    mint) # Linux Mint
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $l_mint $mint; then
	     sleep 2 ; echo -e "$aviso
         " ; exit 0
      else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi         
    ;;

    centos) # CentOS
	  echo
	  # A distro é baixada via axel.
 	  if axel_progresso $centos_os $centos; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi	       
    ;;

    opensuse-leap) # openSUSE
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $opensuse_leap $suseleap; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi       
    ;;

    opensuse-roll) # openSUSE
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $opensuse_roll $suseroll; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi       
    ;;

    slackware) # Slackware Linux
	  echo
	  # A distro é baixada via axel.
      if axel_progresso $slackware $slack; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi       
    ;;

    ubuntu) # Ubuntu
      echo
	  # A distro é baixada via axel.
	  if axel_progresso $ubuntults $buntu; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi 	       
    ;;         

    ubuntuserver) # Ubuntu Server
      echo
	  # A distro é baixada via axel.
      if axel_progresso $ubuntuserverlts $buntuserver; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi       
    ;;

    gentoo) # Gentoo
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $gentoo $gen; then 
	     read -p "${verde}Deseja baixar o Stage 3 do Gentoo? [S/n] ${fecha_cor}" decide
	     # Teste para download de Stage 3.
	     if [ "$decide" = "S" ] || [ "$decide" = "s" ] || \
	     [ "$decide" = "" ]; then
	        sleep 1; echo
	        # Stage 3 via axel.
	        axel_progresso $stage3 $stage
	        sleep 2; echo; exit 0 
		 else    
	        sleep 2; echo -e "$aviso
		    " ; exit 0
		 fi         
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi       
    ;;

    trisquel) # Trisquel GNU/Linux
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $trisquel $trisquellibre; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi	       
    ;;

    deepin) # Deepin Linux
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $deepin $deepinch; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi	       
    ;;

    manjaro-xfce) # Manjaro Xfce
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $manjaro_rato $manjaxfce; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi	       
    ;;
    
    manjaro-plasma) # Manjaro KDE
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $manjaro_plasma $manjakde; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi	       
    ;;
    
    manjaro-gnome) # Manjaro GNOME
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $manjaro_pe $manjagnome; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi	       
    ;;

    elementary) # elementary OS
      echo
	  # A distro é baixada via axel.
	  if axel_progresso $elementary $eos; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi       
    ;;

    puppy) # Puppy Linux
	  echo
	  # A distro é baixada via axel.
      if axel_progresso $puppy $chibi_puppy; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi       
    ;;

    solus) # Solus
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $solus $sol; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi	       
    ;;
    
    parrot-security) # Parrot
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $parrot_sec $pa_security; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi	       
    ;;
    
    sabayon-mate) # Sabayon
	  echo
	  # A distro é baixada via axel.
	  if axel_progresso $sabayon_mate $sabamate; then
	     sleep 2 ; echo -e "$aviso
		 " ; exit 0
	  else
         echo -e "	${vermelho}${negrito} Falha no download. Tente novamente.${fecha_cor}
"
         exit 1
      fi	       
    ;;
								
# Processo de gravação em USB.
    -w|--write) 
	   shift
	   [ "$1" = "archlinux"       ]      && write_arch         ||  \
	   [ "$1" = "artixlinux"      ]      && write_artix        ||  \
	   [ "$1" = "debian"          ]      && write_debian       ||  \
	   [ "$1" = "fedora"          ]      && write_fedora       ||  \
	   [ "$1" = "mint"            ]      && write_mint         ||  \
	   [ "$1" = "centos"          ]      && write_centos       ||  \
	   [ "$1" = "opensuse-leap"   ]      && write_suseleap     ||  \
	   [ "$1" = "opensuse-roll"   ]      && write_suseroll     ||  \
	   [ "$1" = "slackware"       ]      && write_slackware    ||  \
	   [ "$1" = "ubuntu"          ]      && write_ubuntu       ||  \
 	   [ "$1" = "ubuntuserver"    ]      && write_ubuntuserver ||  \
 	   [ "$1" = "gentoo"          ]      && write_gentoo       ||  \
 	   [ "$1" = "trisquel"        ]      && write_trisquel     ||  \
 	   [ "$1" = "deepin"          ]      && write_deepin       ||  \
 	   [ "$1" = "manjaro-xfce"    ]      && write_manjaroxfce  ||  \
 	   [ "$1" = "manjaro-gnome"   ]      && write_manjarognome ||  \
 	   [ "$1" = "manjaro-plasma"  ]      && write_manjarokde   ||  \
 	   [ "$1" = "elementary"      ]      && write_elementary   ||  \
 	   [ "$1" = "puppy"           ]      && write_puppy        ||  \
 	   [ "$1" = "solus"           ]      && write_solus        ||  \
 	   [ "$1" = "parrot-security" ]      && write_parrot       ||  \
 	   [ "$1" = "sabayon-mate"    ]      && write_sabayon      ||  \
 	   [ "$1" = "$*"              ]      && mensagem
   ;;
   
# Sincronização.   
   -s|--sync)
        echo -ne "\t${verde}${negrito}Sincronizando com o repositório...\
        ${fecha_cor} " && loop
   ;;
   
   *)
      [ "$1" = "" ] || [ "$1" = "-h" ] || [ "$1" = "--help" ] && exit
      mensagem
   ;;
			
esac 
#-----------------------------------------------------------------------
